#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"

//静态版本
//void InitContact(Contact* p) 
//{
//	assert(p);//判断接收的是否为空指针
//	memset(p->data, 0, sizeof(p->data));//将data初始化为0
//	p->sz = 0;
//}

//动态版本
void InitContact(Contact* pc)
{
	assert(pc);
	pc->data = (PeoInfo*)malloc(DEFAULT * sizeof(PeoInfo));
	memset(pc->data, 0, sizeof(pc->data));

	if (pc->data == NULL)
	{
		perror("InitContact");
		return;
	}
	pc->sz = 0;
	pc->capacity = DEFAULT;
}


//静态
//void AddContact(Contact* p)
//{
//	assert(p);
//	if (p->data == p->sz)
//	{
//		printf("通讯录已满，无法添加");
//		return;
//	}
//	printf("输入名字:>");
//	scanf("%s", p->data[p->sz].name);	
//	printf("输入年龄:>");
//	scanf("%d", &(p->data[p->sz].age));
//	printf("输入性别:>");
//	scanf("%s", p->data[p->sz].sex);
//	printf("输入电话:>");
//	scanf("%s", p->data[p->sz].tele);
//	printf("输入地址:>");
//	scanf("%s", p->data[p->sz].addr);
//	p->sz++;
//	printf("成功添加联系人\n");
//}


//动态
int CheckCapacity(Contact* pc)
{
	if (pc->sz == pc->capacity)
	{
		PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capacity + INC_SZ) * sizeof(PeoInfo));
		if (ptr == NULL)
		{
			perror("CheckCapacity");
			return 0;
		}
		else
		{
			pc->data = ptr;
			pc->capacity += INC_SZ;
			printf("增容成功\n");
			return 1;
		}
	}
	return 1;
}

void AddContact(Contact* pc)
{
	assert(pc);
	if (pc->sz == MAX)

		if (0 == CheckCapacity(pc))
		{
			printf("通讯录已满，无法添加\n");
			return;
		}
	printf("请输入名字:>");
	scanf("%s", pc->data[pc->sz].name);
	printf("请输入年龄:>");
	scanf("%d", &(pc->data[pc->sz].age));
	printf("请输入性别:>");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入电话:>");
	scanf("%s", pc->data[pc->sz].tele);
	printf("请输入地址:>");
	scanf("%s", pc->data[pc->sz].addr);

	pc->sz++;
	printf("成功增加联系人\n");
}

void ShowContact(Contact* p)
{
	assert(p);
	if (p->sz == 0)
	{
		printf("通讯录为空\n");
		return;
	}
	int i = 0;
	printf("%-10s\t%-4s\t%-5s\t%-12s\t%-30s\n", "姓名", "年龄", "性别", "电话", "住址", "");
	for (i = 0; i < p->sz; i++)
	{
		printf("%-10s\t%-4d\t%-5s\t%-12s\t%-30s\n",
			p->data[i].name,
			p->data[i].age,
			p->data[i].sex,
			p->data[i].tele,
			p->data[i].addr);
	}
}

static int FindName(const Contact* p,char name[])
{
	int i = 0; 
	for (i = 0; i < p->sz; i++)
	{
		if (strcmp(p->data[i].name, name) == 0)
		{	
			return i;
		}
	}

	return -1;
}
void DelContact(Contact* p)
{

	if (p->sz == 0)
	{
		printf("通讯录已空，无法删除");
		return;
	}
	assert(p);
	char name[MAX_NAME] = { 0 };
	printf("输入要删除的用户名\n");
	scanf("%s", &name);

	int del = FindName(p,name);//存储下标

	if (del == -1)
	{
		printf("要删除的人不存在\n");
		return;
	}
	int i = 0;
	for (i = del; i < p->sz - 1 ; i++)
	{
		p->data[i] = p->data[i + 1];
	}
	p->sz--;
	printf("成功删除联系人\n");
}

void SearchContact(Contact* p)
{
	assert(p);
	char name[MAX_NAME] = { 0 };
	printf("输入要查找人的名字\n");
	scanf("%s", &name);
	int del = FindName(p, name);
	if (del == -1)
	{
		printf("要查找的人不存在\n");
		return;
	}
	else
	{
		printf("%-10s\t%-4s\t%-5s\t%-12s\t%-30s\n", "姓名", "年龄", "性别", "电话", "住址", "");

		printf("%-10s\t%-4d\t%-5s\t%-12s\t%-30s\n",
				p->data[del].name,
				p->data[del].age,
				p->data[del].sex,
				p->data[del].tele,
				p->data[del].addr);

	}
}


void ModifyContact(Contact* p)
{
	assert(p);
	char name[MAX_NAME] = { 0 };
	printf("输入要修改的用户名\n");
	scanf("%s", &name);
	int del = FindName(p, name);
	if (del == -1)
	{
		printf("要修改的用不存在\n");
		return;
	}
	else
	{
		printf("输入名字:>");
		scanf("%s", p->data[del].name);
		printf("输入年龄:>");
		scanf("%d", &(p->data[del].age));
		printf("输入性别:>");
		scanf("%s", p->data[del].sex);
		printf("输入电话:>");
		scanf("%s", p->data[del].tele);
		printf("输入地址:>");
		scanf("%s", p->data[del].addr);

	}
	printf("成功修改联系人\n");
}

int compar_age(const void* a, const void* b)
{
	Contact* A = (Contact*)a;
	Contact* B = (Contact*)b;
	return memcmp(B, A, sizeof(Contact));
}
void SortContactAge(Contact* p)
{
	assert(p);
	qsort(p->data, p->sz, sizeof(p->data[0]), compar_age);//第一个成员结构体的地址，排序p->sz（成员数）次，
	//每个元素大小为一个成员结构体的大小,排序函数我们则通过比较两个结构体成员内容的大小
	printf("%-10s\t%-4s\t%-5s\t%-12s\t%-30s\n", "姓名", "年龄", "性别", "电话", "住址", "");
	int i = 0;
	for (i = 0; i < p->sz; i++)
	{
		printf("%-10s\t%-4d\t%-5s\t%-12s\t%-30s\n",
			p->data[i].name,
			p->data[i].age,
			p->data[i].sex,
			p->data[i].tele,
			p->data[i].addr);
	}
	printf("排序成功\n");
}


void DestoryContact(Contact* p)
{
	free(p->data);
	p->data = NULL;
	p->capacity = 0;
	p->sz = 0;
}